 

/*-------------------------------------------------------------------------
 *
 * standbydefs.h
 *	   前端公开的热备份模式定义。
 *
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/storage/standbydefs.h
 *
 *-------------------------------------------------------------------------
 */
#ifndef STANDBYDEFS_H
#define STANDBYDEFS_H

#include "access/xlogreader.h"
#include "lib/stringinfo.h"
#include "storage/lockdefs.h"
#include "storage/sinval.h"

/* 备用 Rmgr (RM_STANDBY_ID) 的恢复处理程序 */
extern void standby_redo(XLogReaderState *record);
extern void standby_desc(StringInfo buf, XLogReaderState *record);
extern const char *standby_identify(uint8 info);
extern void standby_desc_invalidations(StringInfo buf,
									   int nmsgs, SharedInvalidationMessage *msgs,
									   Oid dbId, Oid tsId,
									   bool relcacheInitFileInval);

/*
 * XLOG 消息类型
 */
#define XLOG_STANDBY_LOCK			0x00
#define XLOG_RUNNING_XACTS			0x10
#define XLOG_INVALIDATIONS			0x20

typedef struct xl_standby_locks
{
	int			nlocks;			/* 锁数组中的条目数量 */
	xl_standby_lock locks[FLEXIBLE_ARRAY_MEMBER];
} xl_standby_locks;

/*
 * 当我们将运行中的 xact 数据写入 WAL 时，使用此结构。
 */
typedef struct xl_running_xacts
{
	int			xcnt;			/* xids[] 中的事务 ID 数量 */
	int			subxcnt;		/* xids[] 中的子事务 ID 数量 */
	bool		subxid_overflow;	/* 快照溢出，缺少 subxids */
	TransactionId nextXid;		/* 来自 ShmemVariableCache->nextXid 的 xid */
	TransactionId oldestRunningXid; /* *不是* oldestXmin */
	TransactionId latestCompletedXid;	/* 因此我们可以设置 xmax */

	TransactionId xids[FLEXIBLE_ARRAY_MEMBER];
} xl_running_xacts;

/*
 * 用于备用的无效标识，目前仅在没有分配 xid 的事务提交时使用。
 */
typedef struct xl_invalidations
{
	Oid			dbId;			/* MyDatabaseId */
	Oid			tsId;			/* MyDatabaseTableSpace */
	bool		relcacheInitFileInval;	/* 使 relcache 初始化文件无效 */
	int			nmsgs;			/* 共享无效消息的数量 */
	SharedInvalidationMessage msgs[FLEXIBLE_ARRAY_MEMBER];
} xl_invalidations;

#define MinSizeOfInvalidations offsetof(xl_invalidations, msgs)

#endif							/* STANDBYDEFS_H */
